﻿#define _CRT_SECURE_NO_WARNINGS  1
#include<iostream>
#include<string>
using namespace std;

//class person
//{
//protected:
////public:
//	void print()
//	{
//		cout << "name:" << _name << endl;
//		cout << "age:" << _age << endl;
//	}
//
//protected:
//	string _name = "joker";
//	int _age = 18;
//};
//
//
//class student:public person
//{
//public:
//	void print()
//	{
//		person::print();
//	}
//protected:
//	int _num;
//};
//
//class teacher :public person
//{
//public:
//	void print()
//	{
//		person::print();
//	}
//protected:
//	int _job;
//};
//
//
//int main()
//{
//	student s;
//	teacher t;
//	s.print();
//	t.print();
//	return 0;
//}



//class person
//{
//protected:
//	void print()
//	{
//		cout << "person"<< endl;
//	}
//};
//
//
//class student:public person
//{
//public:
//	void fun1()
//	{
//		person::print();
//	}
//
//private:
//	int _a;
//};
//
//int main()
//{
//	student s;
//	//s.print();
//	s.fun1();
//	return 0;
//}


//class person
//{
//public:
//	void print()
//	{
//		cout << "person"<< endl;
//	}
//protected:
//	string _name="zhangsan";
//};
//
//class student :public person
//{
//public:
//	void fun1()
//	{
//		print();
//	}
//
//protected:
//	int _num=102441324;
//};
//
//
//int main()
//{
//	person p;
//	student s;
//	p = s;
//	return 0;
//}


//class Person
//{
//public:
//	Person(const char* p1 = "Person", const char* p2 = "Person", int age = 0)
//		:_name(p1)
//		, _sex(p2)
//		, _age(age)
//	{}
//protected:
//	
//	string _name; // 姓名
//	string _sex; 
//	int _age; // 年龄
//};
//class Student : public Person
//{
//public:
//	Student()
//		:Person("Student", "Student", 58)
//		, _No(12345)
//	{}
//	int _No; // 学号
//};


//class person
//{
//public:
//	void print()
//	{
//		cout << "p" << endl;
//	}
//
//protected:
//	int _a;
//};
//
//class student :public person
//{
//public:
//	void print()
//	{
//		cout << "s" << endl;
//	}
//protected:
//	int _a;
//};
//
//int main()
//{
//	student s;
//	s.print();
//	s.person::print();
//}

//int  main()
//{
//	Student s;
//	// 1.子类对象可以赋值给父类对象/指针/引用
//	/*Person p1;
//	p1 = s;
//	s = p1;
//	Person& p2 = s;
//	Person* p3 = &s;
//	*/
//
//	/*Person* p = &s;
//	Student* s1 = (Student*)p;
//	s1->_No = 20;
//	return 0;*/
//
//	Person p1;
//	p1 = s;
//	Person* pp = &p1;
//	Student* ps2 = (Student*)pp; 
//		ps2->_No = 10;
//}




//class Person
//{
//public:
//	Person(const char* p1, const char* p2, int age)
//		:_name(p1)
//		, _sex(p2)
//		, _age(age)
//	{
//		cout << "Person" << endl;
//	}
//
//	Person(const Person& p)
//		:_name(p._name)
//		, _sex(p._sex)
//		, _age(p._age)
//	{
//		cout << "Person(const Person& p)" << endl;
//	}
//	
//	Person& operator=(const Person& p)
//	{
//		if (this != &p)
//		{
//			_name = p._name;
//			_sex = p._sex;
//			_age = p._age;
//		}
//		cout << "Person operator=(const Person& p)" << endl;
//		return *this;
//
//	}
//
//
//	~Person()
//	{
//		cout << "~Person" << endl;
//	}
//protected:
//	
//	string _name; // 姓名
//	string _sex; 
//	int _age; // 年龄
//};
//class Student : public Person
//{
//public:
//	Student(int No=0)
//		:Person("Student", "Student", 58)
//		, _No(No)
//	{
//		cout << "Student" << endl;
//	}
//
//	Student(const Student& s)
//		:_No(s._No)
//		, Person(s)  //切片
//	{
//		cout << "Student(const Student& s)" << endl;
//	}
//
//	Student& operator=(const Student& s)
//	{
//		if (this != &s)
//		{
//			//先调用基类
//			Person::operator=(s);//切片
//			_No = s._No;
//
//		}
//		cout << "Student operator=(const Student& s)" << endl;
//		return *this;
//		
//	}
//	
//
//	~Student()
//	{
//		cout << "~Student" << endl;
//	}
//	int _No; // 学号
//};
//
//
//int main()
//{
//	Person p("PEr","PEr",123);
//	Student s(1234);
//
//	Student s3(s);
//	Student s4;
//	s4=s3;
//}



//class Person
//{
//public:
//	friend void print(const Person& p);
//protected:
//	string _name="lisan"; // 姓名
//};
//
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//
//void print(const Person& p)
//{
//	cout << p._name<< endl;
//}
//
//int main()
//{
//	Person p;
//	Student s;
//	s.print();
//	print(p);
//}



//class Person
//{
//public:
//	Person() { ++_count; }
//protected:
//	string _name; // 姓名
//public:
//	static int _count; // 统计人的个数。
//};
//
//int Person::_count = 0;
//
//
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//
//
//class Graduate : public Student
//
//{
//protected:
// string _seminarCourse; // 研究科目
//};
//void TestPerson()
//{
//	Student s1;
//	Student s2;
//	Student s3;
//	Graduate s4;
//	cout << " 人数 :" << Person::_count << endl;
//	Student::_count = 0;   // Student 里的_count改变了，Person类的_count也跟着改变了，说明他们是同一个_count
//	cout << " 人数 :" << Person::_count << endl;
//}
//
//int main()
//{
//	TestPerson();
//	return 0;
//}

//
//
//class Person
//{
//public:
//	string _name; // 姓名
//};
//
//class Student :virtual public Person
//{
//protected:
//	int _num; //学号
//};
//
//class Teacher : virtual public Person
//{
//protected:
//	int _id; // 职工编号
//};
//class Card : public Student, public Teacher
//{
//protected:
//	string Cardnum; // 主修课程
//};
//void Test()
//{
//	Card a;
//}
//
//int main()
//{
//	Test();
//}


//class A
//{
//public:
//	int _a;
//};
//class B : virtual public A
//{
//public:
//	int _b;
//};
//class C : virtual public A
//{
//public:
//	int _c;
//};
//class D : public B, public C
//{
//public:
//	int _d;
//};
//int main()
//{
//	D d;
//	d.B::_a = 1;
//	d.C::_a = 2;
//	d._b = 3;
//	d._c = 4;
//	d._d = 5;
//	return 0;
//}



class A
{
public:
	void print()
	{
		cout << "A" << endl;
	}

protected:
	int _a;
};

class B
{
protected:
	A _b;
};


int main()
{
	B b;

}